package com.tbit.uqbike.service.business;

import com.tbit.uqbike.object.pojo.DepositCount;
import com.tbit.uqbike.object.pojo.User;
import com.tbit.uqbike.object.pojo.dto.BatchRegisterAuthDTO;
import com.tbit.uqbike.object.pojo.dto.UserDTO;
import com.tbit.uqbike.object.pojo.vo.UserVO;
import com.tbit.uqbike.object.value.LoginInfo;
import com.tbit.uqbike.object.view.NameObject;

import java.io.FileNotFoundException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author chenmengran
 * @Description: 用户信息
 * @date 2019\12\16 001615:52
 */
public interface UserService {
    /**
     * 查询个数
     *
     * @param loginInfo
     * @return
     */
    Integer queryCount(LoginInfo loginInfo, String phone, String name, String idNo, Integer nameAuth, Integer depositState, Long startTime, Long endTime);

    /**
     * 分页查询
     *
     * @param loginInfo
     * @param phone
     * @param name
     * @param idNo
     * @param rowCount
     * @param pageNO
     * @return
     */
    List<User> queryPage(LoginInfo loginInfo, String phone, String name, String idNo, Integer rowCount, Integer pageNO, Integer nameAuth, Integer depositState, Long startTime, Long endTime);

    /**
     * 用户
     *
     * @param accountId
     * @return
     */
    List<User> getByAccountIdAndPhone(Integer accountId, String phone);

    /**
     * 根据身份证号码查询用户
     *
     * @param accountId
     * @return
     */
    List<User> getByAccountIdAndIdNo(Integer accountId, String idNo);

    /**
     * 用户
     *
     * @param accountId
     * @param phone
     * @return
     */
    User getByAccountPhone(Integer accountId, String phone);

    /**
     * 更加用户id查询
     *
     * @param userId
     * @return
     */
    User getByUserId(Integer userId);

    /**
     * 批量查询用户
     *
     * @param userIds
     * @return
     */
    List<User> getByUserIdBatch(List<Integer> userIds);

    /**
     * 更新账户金额
     *
     * @param userId    用户id
     * @param money     钱
     * @param debtMoney 欠款金额
     */
    void updateMoney(Integer userId, Integer money, Integer debtMoney);

    /**
     * 冻结押金
     *
     * @param userId
     * @param depositState
     */
    void frozenDeposit(Integer userId, Integer depositState);

    /**
     * 更新押金支付状态
     *
     * @param userId
     * @param deposit
     * @param depositMoney
     */
    void updateDeposit(Integer userId, Integer deposit, Integer depositMoney);

    /**
     * 更新实名认证
     *
     * @param studentAuth
     * @param studentIdNo
     */
    void updateStudentAuth(Integer userId, Integer studentAuth, String studentIdNo);

    /**
     * 实名认证
     *
     * @param name
     * @param idNO
     */
    void updateNameAuth(Integer userId, String name, String idNO, LoginInfo login);

    /**
     * 获取用户费用
     *
     * @param phone
     * @param loginInfo
     * @return
     */
    Long getUserFee(String phone, LoginInfo loginInfo);

    /**
     * 根据品牌id和身份证号查询
     *
     * @param accountId
     * @param idNO
     * @return
     */
    List<User> getByAccountAndIdNO(Integer accountId, String idNO);

    /**
     * 余额充值
     *
     * @param userId
     * @param money
     * @param remark
     */
    void recharge(Integer userId, Integer money, String remark, LoginInfo loginInfo);

    /**
     * 通过区域运营商id查询
     */
    User getByAdaccountId(Integer accountId, String phone);

    /**
     * 性别分组
     */
    List<NameObject> groupBySex(List<Integer> accountIds);

    /**
     * 年龄分组
     */
    List<NameObject> groupByBirth(List<Integer> accountIds);

    /**
     * 新增用户按天分组或按月分组
     */
    List<NameObject> statByType(List<Integer> accountIds, String startTime, String endTime,
                                Integer type);

    /**
     * 清空实名认证信息
     *
     * @param userId
     */
    void editNameAuth(Integer userId);

    /**
     * 统计平台用户总数、总金额、总欠款
     */
    Integer countByType(Integer type, Integer accountId);

    /**
     * 押金统计
     */
    DepositCount countDeposit(Integer accountId);

    int updateUser(Integer userId, String phone, Integer operaUserId, String reson, LoginInfo login);

    int getUserCount(User user);

    /**
     * @Description: 导出区域用户列表
     * @Param: [user]
     * @return: java.util.List<com.tbit.uqbike.object.pojo.User>
     * @Author: Jing
     * @Date: 2021/5/17
     */
    List<UserDTO> getUserList(User user, int pageNo, int excelCount);

    String batchExport(User user, boolean exportBrandName, String sheetName) throws FileNotFoundException;

    /**
     * 新增用户按天分组或按月分组
     *
     * @param accountIds
     * @param startTime
     * @param endTime
     * @param type       0:按天  1:按月
     * @return
     */
    List<NameObject> statByTypePlus(List<Integer> accountIds, Date startTime, Date endTime, Integer type);

    /**
     * 新增用户
     *
     * @param user 用户信息
     */
    void insert(User user);

    /**
     * 根据手机号批量查询用户信息
     *
     * @param phoneList 手机号
     * @param accountId 品牌id
     * @return 。
     */
    Map<String, User> mapByUserPhone(Set<String> phoneList, Integer accountId);

    /**
     * 根据用户id批量查询用户信息
     *
     * @param userIdSet 手机号
     * @param accountId 品牌id
     * @return 。
     */
    Map<Integer, User> mapByUserIdAndAccountId(Set<Integer> userIdSet, Integer accountId);

    /**
     * 添加用户备注
     *
     * @param userId 用户id
     * @param remark 备注
     */
    void addUserRemark(Integer userId, String remark);

    /**
     * 清空实名认证提交次数
     *
     * @param userId
     */
    void editNameAuthCount(Integer userId);

    void clearStudentAuth(Integer userId);

    void batchRegisterAuth(List<BatchRegisterAuthDTO> list, Integer override,LoginInfo loginInfo);

    String batchRegisterAuthCheck(List<BatchRegisterAuthDTO> list);

    /**
     * 将品牌下所有用户的登录状态设置为过期(将token置为过期)
     *
     * @param accountId 品牌id
     */
    void expireLogin(Integer accountId);

    List<User> getIdByAccountIdAndPhoneAndNameAndIdNo(Integer accountId, String phone, String name, String idNo);

    /**
     * 查询用户看板
     *
     * @param userId 用户id
     */
    UserVO getInfoByUserId(Integer userId, String accountIds);
}
